// src/utils/auth.js
import Cookies from "js-cookie";
import { jwtDecode } from "jwt-decode";
import { http } from "@/api/http/request";
import { storage } from "./storage";
import { useUserStore } from "@/stores/modules/user";
import { API_URLS } from "@/api/constants/api-url";

const AccessToken = "accessToken"; // --访问令牌，使用accessToken作为依据判断用户登录状态
const RefreshToken = "refreshToken"; // --刷新令牌，用于刷新访问令牌

export async function checkAuthStatus(inputToken?: string): Promise<{
  isValid: boolean;
  reason?: "MISSING_TOKEN" | "INVALID_FORMAT" | "EXPIRED" | "SERVER_ERROR";
  payload?: any; // 添加payload返回，便于其他地方使用
}> {
  try {
    const token = inputToken || storage.get<string>(AccessToken);
    
    // 1. 无token
    if (!token) return { isValid: false, reason: "MISSING_TOKEN" };

    // 2. 格式检查
    const tokenParts = token.split(".");
    if (tokenParts.length !== 3) {
      return { isValid: false, reason: "INVALID_FORMAT" };
    }

    // 3. 过期检查
    let payload: any;
    try {
      payload = JSON.parse(atob(tokenParts[1]));
      
      // 检查过期时间
      if (payload.exp && payload.exp < Math.floor(Date.now() / 1000)) {
        storage.remove(AccessToken); // 清理过期token
        return { isValid: false, reason: "EXPIRED", payload };
      }
    } catch (error) {
      console.error("Token解码失败:", error);
      return { isValid: false, reason: "INVALID_FORMAT" };
    }

    // 4. 服务端验证（仅在需要时进行）
    // 注意：频繁的服务器验证可能增加负载，可以根据业务需求调整
    try {
      const res = await http.get(API_URLS.AUTH_VERIFY_TOKEN, { 
        skipAuth: false,
        timeout: 5000 // 添加超时控制
      });
      
      return {
        isValid: res.valid,
        reason: res.valid ? undefined : "SERVER_ERROR",
        payload
      };
    } catch (error) {
      console.error("Token服务器验证失败:", error);
      // 服务器验证失败时，可以基于本地验证结果返回
      // 根据业务需求，可以选择信任本地验证或要求重新登录
      return { 
        isValid: false, 
        reason: "SERVER_ERROR",
        payload
      };
    }
  } catch (error) {
    console.error("Token验证异常:", error);
    return { isValid: false, reason: "SERVER_ERROR" };
  }
}

// 辅助函数：检查路由是否需要认证
export function requiresAuth(route: any): boolean {
  return route.meta && route.meta.requiresAuth !== false;
}

// 辅助函数：检查是否是公开路由
export function isPublicRoute(route: any): boolean {
  return route.meta && route.meta.public === true;
}

/*
 * 基础版验证token过期，
 * 需要加上服务端验证，可以控制用户的禁用、启用
 */
// 检查 Token 是否过期
export function isTokenExpired(token: string | null) {
  if (!token) return true;
  try {
    const decoded = jwtDecode(token);
    if (!decoded.exp) return true;
    return decoded.exp * 1000 < Date.now(); // exp 是秒，需转毫秒
  } catch (e) {
    return true; // 解析失败视为过期
  }
}

// 定时检查（例如每分钟检查一次）
export function setupTokenCheck(bool: boolean): () => void {
  console.log("开启定时检查");
  const userStore = useUserStore();
  const intervalId = setInterval(() => {
    const token = storage.get<string>(RefreshToken);
    if (isTokenExpired(token)) {
      alert("登录已过期，请重新登录");
      userStore.clearToken(); // 清除 Token 并跳转到登录页

      storage.remove(AccessToken);
      storage.remove(RefreshToken);
      setTimeout(() => {
        window.location.href = "/login";
      }, 1500);
    }
  }, 60 * 1000); // 每分钟检查一次

  return () => {
    clearInterval(intervalId);
    console.log("已关闭定时检查");
  };
}
